
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
//import java.util.StringTokenizer;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class LeerXMLSync {
	public static void main(String args[]) {
				
		if ( args.length != 2) {
		System.err.println("Uso: java LeerXMlSync archivo.xml (cuenta||procesa)");
		System.exit(-1);
		}
		final String archivo = args[0];
		final String operacion = args[1];
		try {
									
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser saxParser = factory.newSAXParser();
			
			DefaultHandler handler = new DefaultHandler() {
			
			StringBuffer Contenido = new StringBuffer();
			//String NumberOfMessages = "";
			//String PortID = "";
			String PortType = "";
			String Action = "";
			int numeros = 0;
			int nivel = 0;
			int portados = 0;
			int borrados = 0;
		    int revertidos = 0;
			String numero = "";
			String ismpp = "";
			String Donor = "";
			String datos = "";
			String Recipient = "";
			String fEjec = "";
			String fArch = "";
									
			public void startElement(String uri, String localName,
					String qName, Attributes attibutes)
			        throws SAXException {
				Contenido.setLength(0);
				if (qName.equalsIgnoreCase("PortData")) {
					nivel = 0;
				}
				if (qName.equalsIgnoreCase("Number")) {
					nivel ++;
					//System.out.println("Number nivel " + nivel);
				}
			}
			public void characters(char ch[], int start, int length)
			         throws SAXException {
				try {
					String texto = new String(ch, start, length);
					Contenido = Contenido.append(texto);
					datos = Contenido.toString();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			public void endElement(String uri, String localName, String qName)  
			         throws SAXException {
				if (qName.equalsIgnoreCase("Timestamp")) {
					fArch = datos;
					/*fArch = datos.substring(6, 8) + "/" +
						    datos.substring(4, 6) + "/" +
						    datos.substring(0, 4) + " " +
						    datos.substring(8, 10) + ":" +
						    datos.substring(10, 12) + ":" +
						    datos.substring(12, 14);*/
				}
				if (qName.equalsIgnoreCase("PortType")) {
					PortType = datos;
				}
				if (qName.equalsIgnoreCase("Action")) {
					Action = datos;
					if (Action.equals("Port")) {
						portados ++;
					}
					if (Action.equals("Delete")) {
						borrados ++;
					}
					if (Action.equals("Reverse")) {
						revertidos ++;
					}
				}
				if (qName.equalsIgnoreCase("Number")) {
					if (nivel == 2) {
						//System.out.println("Number nivel " + nivel);
						numero = datos;
						nivel --;
						numeros ++;
					}
				}
				if (qName.equalsIgnoreCase("isMPP")) {
					ismpp = datos;
				}
				if (qName.equalsIgnoreCase("Donor")) {
					if (Action.equalsIgnoreCase("Reverse")) {
						Recipient = datos;
					}else {
						Donor = datos;
					}
				}
				if (qName.equalsIgnoreCase("Recipient")) {
					if (Action.equalsIgnoreCase("Reverse")) {
						Donor = datos;
					}else {
						Recipient = datos;
					}
				}
				if (qName.equalsIgnoreCase("ActionDate")) {
					fEjec = datos;
				}
				if (qName.equalsIgnoreCase("PortData")) {
					//procesos ++;
					
					/*String ejec = fEjec.substring(6, 8) + "/" +
							       fEjec.substring(4, 6) + "/" +
							       fEjec.substring(0, 4) + " " +
							       fEjec.substring(8, 10) + ":" +
							       fEjec.substring(10, 12) + ":" +
							       fEjec.substring(12, 14);*/

					String linea = numero + "|" +
							       "0" + "|" +
							       numero + "|" +
							       numero + "|" +
							       Donor + "|" +
							       Recipient + "|" +
							       "N" + "|" +
							       ismpp + "|" +
							       fArch + "|" +
							       fEjec + "|" +
							       PortType + "|" +
							       Action + "|" +
							       "Sync";
							
							if (operacion.equalsIgnoreCase("procesa")) {
								System.out.println(linea);	
							}
						}
				
				if (qName.equalsIgnoreCase("NPCData")) {
					if (operacion.equalsIgnoreCase("cuenta")) {
						System.out.println("Archivo analizado: " + archivo);
						System.out.println("Contiene:");
						System.out.println( portados + "\tPortados.");
						System.out.println( borrados + "\tBorrados.");
						System.out.println( revertidos + "\tRevertidos.");
						System.out.println( numeros + "\tTotal.");
					}
				}
			}			
		};
		
		saxParser.parse(args[0], handler);
		
	} catch (Exception e) {
		e.printStackTrace();
		}
	}
	
	public static String fecha () {
		String fech = "";
		SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		
		Calendar cal1 = Calendar.getInstance();
	    fech = df.format(cal1.getTime());
	    return fech;
	}
}